/*
*Copyright (C),2023 , NANOCHAP
*File name:   ENS1_GPIO.C         
*Author:      
*Version:     V1.0 
*Date:        2023-11-                  
*Description:  
*Function List: 

History: 
1.V1.0
Date:          
Author: 
Modification: 初版
*/
#include "my_header.h"
#include "ENS1_GPIO.h"

//IO复用
uint8_t GPIO_AltFunction(GPIO_NUM GPIO_X , GPIO_AltFuncSel GPIO_AltFuncSelx){	
	if(GPIO_X >15)
	{
		CMSDK_GPIO->ALTFH &=~ (0x3 << ((GPIO_X-16)*2));
		CMSDK_GPIO->ALTFH |= (GPIO_AltFuncSelx << ((GPIO_X-16)*2));
	}
	else 
	{
		CMSDK_GPIO->ALTFL &=~ (0x3 << (GPIO_X*2) );
		CMSDK_GPIO->ALTFL |= (GPIO_AltFuncSelx << (GPIO_X*2));
	}
	return 0;
}


//IO口输入输出设置,形参1：gpio号，形参2：输入输出选择 ，形参3：使能与否
int8_t GPIO_IO_Select(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,FunctionalState ENABLEorNOT){
	if(INorOUT == INPUT && ENABLEorNOT ==ENABLE)
	{
		CMSDK_GPIO->OE &=~ (1<<GPIO_X);
		CMSDK_GPIO->IE |= (1<<GPIO_X);
	}
	else if(INorOUT == INPUT && ENABLEorNOT ==DISABLE)
	{
		CMSDK_GPIO->OE &=~ (1<<GPIO_X);
		CMSDK_GPIO->IE &=~ (1<<GPIO_X);
	}
	else if(INorOUT == OUTPUT && ENABLEorNOT ==ENABLE)
	{
		CMSDK_GPIO->IE &=~ (1<<GPIO_X);
		CMSDK_GPIO->OE |= (1<<GPIO_X);
	}
	else if(INorOUT == OUTPUT && ENABLEorNOT == DISABLE)
	{
		CMSDK_GPIO->OE &=~ (1<<GPIO_X);
		CMSDK_GPIO->IE &=~ (1<<GPIO_X);
	}
	else 
		return -1;
	return 0;
}

//读取IO口输入状态
uint8_t GPIO_GetInputValue(GPIO_NUM GPIO_X){ 
	return (uint8_t)((CMSDK_GPIO->DATAIN & (1<<GPIO_X))>>GPIO_X);
}

//读取IO口输出状态
uint8_t GPIO_GetOutputValue(GPIO_NUM GPIO_X){ 
	return (uint8_t)((CMSDK_GPIO->DATAOUT & (1<<GPIO_X))>>GPIO_X);
}

//设置输出电平为高或低
void GPIO_Output(GPIO_NUM GPIO_X,LEVELStatus HIGHorLOW){
	if(HIGHorLOW == HIGH_LEVEL)
	{
		CMSDK_GPIO->DATAOUT |= (1<<GPIO_X);
	}
	else 
	{
		CMSDK_GPIO->DATAOUT &=~ (1<<GPIO_X);
	}
}

//设置输出电平为高
void GPIO_SetOutput(GPIO_NUM GPIO_X){
	CMSDK_GPIO->DATAOUT |= (1<<GPIO_X);
}

//设置输出电平为低
void GPIO_ResetOutput(GPIO_NUM GPIO_X){
	CMSDK_GPIO->DATAOUT &=~ (1<<GPIO_X);
}

//IO反转
void  GPIO_Overturn(GPIO_NUM GPIO_X){
	if(GPIO_GetOutputValue(GPIO_X) == HIGH_LEVEL)
	{
		GPIO_ResetOutput(GPIO_X);
	}
	else if(GPIO_GetOutputValue(GPIO_X) == LOW_LEVEL)
	{   
		GPIO_SetOutput(GPIO_X);
	}		

}

//模拟功能使能失能
void GPIO_AnalogChannel_Control(GPIO_NUM GPIO_X ,FunctionalState ENABLEorNOT )
{
	if(ENABLEorNOT == ENABLE)
		CMSDK_GPIO->ANAEN |= (1 << GPIO_X);
	else if(ENABLEorNOT == DISABLE)
		CMSDK_GPIO->ANAEN &=~ (1 << GPIO_X);
	else
		return ;
}




